#pragma once

#include <iostream>
#include <string>
#include "util.hpp"

namespace ns_log
{
    using namespace ns_util; 

    // 日志等级
    enum 
    {
        INFO,
        DEBUG,
        WARNING,
        ERROR,
        FATAL
    };

    // 输出日志
    // Log(level) << message
    static std::ostream& Log(const std::string& level, const std::string& file_name, const int line)
    {
        std::string msg;
        // 添加日志等级
        msg += '[' + level + ']';
        // 添加出错的文件名称
        msg += '[' + file_name + ']';
        // 添加出错的行号
        msg += '[' + std::to_string(line) + ']';
        // 添加当前的时间戳
        msg += '[' + TimeUtil::GetTimeStamp() + ']';

        // cout 内部是包含缓冲区的，不需要 endl 进行刷新
        std::cout << msg;
        
        return std::cout;
    }
    // 开放式日志
    // #level 可以将level当成同名的字符串传入参数，比如你调用 LOG(INFO)，不会真的将enum值传入，而是传入 INFO 作为参数传入 Log 函数
    #define LOG(level) Log(#level, __FILE__, __LINE__)
}